package com.rw.coco.handler.message.reply.util;

import com.rw.coco.api.data.CacheMapper;
import com.rw.coco.util.CocoOptionUtil;
import com.rw.tool.util.json.JsonUtil;

import java.util.Optional;

/**
 * 频率限制工具类
 */
public class FrequencyUtil {
    // 最大警告次数
    public static final int maxWarnCount = CocoOptionUtil.OPTION_PROP.getInt(CocoOptionUtil.MAX_WARN_COUNT);

    // 警告持续时间，这里的单位是毫秒
    public static final long warnTime =
            CocoOptionUtil.OPTION_PROP.getLong(CocoOptionUtil.WARN_TIME) * 24 * 60 * 60 * 1000;

    // 群聊频率指定时间
    public static final long groupFreqTime = CocoOptionUtil.OPTION_PROP.getLong(CocoOptionUtil.GROUP_FREQ_TIME);

    // 群聊频率指定次数
    public static final int groupFreqCount = CocoOptionUtil.OPTION_PROP.getInt(CocoOptionUtil.GROUP_FREQ_COUNT);

    // 个人频率指定时间
    public static final long privateFreqTime = CocoOptionUtil.OPTION_PROP.getLong(CocoOptionUtil.PRIVATE_FREQ_TIME);

    // 个人频率指定次数
    public static final int privateFreqCount = CocoOptionUtil.OPTION_PROP.getInt(CocoOptionUtil.PRIVATE_FREQ_COUNT);

    /**
     * 增加一次访问频率计数，并返回群组频率是否超频
     */
    public static boolean countGroupFreq(String token, CacheMapper cacheMapper) {
        return countFreq(token, groupFreqTime, groupFreqCount, cacheMapper);
    }

    /**
     * 增加一次访问频率计数，并返回私聊频率是否超频
     */
    public static boolean countPrivateFreq(String token, CacheMapper cacheMapper) {
        return countFreq(token, privateFreqTime, privateFreqCount, cacheMapper);
    }

    private static boolean countFreq(String token, long freqTime, int freqCount, CacheMapper cacheMapper) {
        // 如果允许的访问次数小于等于1，则每次访问都超频
        if (freqCount <= 1) {
            return true;
        }

        Optional<String> optional = cacheMapper.get(token);
        // 如果没有频率信息，则加入频率
        if (!optional.isPresent()) {
            cacheMapper.save(token, "1", freqTime);
            return false;
        }

        // 如果有频率信息，则增加计数
        int count = JsonUtil.convertObj(optional.get(), Integer.class) + 1;
        // 如果超频，则清除计数
        if (count >= freqCount) {
            cacheMapper.delete(token);
            return true;
        }

        // 未过频，记录计数
        cacheMapper.replace(token, String.valueOf(count));
        return false;
    }

    /**
     * 增加，并获取警告次数
     */
    public static int warn(String token, CacheMapper cacheMapper) {
        Optional<String> optional = cacheMapper.get(token);
        // 如果没有频率信息，则加入警告次数
        if (!optional.isPresent()) {
            cacheMapper.save(token, "1", warnTime);
            return 1;
        }

        // 获取，并增加计数
        int count = JsonUtil.convertObj(optional.get(), Integer.class) + 1;
        cacheMapper.replace(token, String.valueOf(count));
        return count;
    }
}
